home *** CD-ROM | disk | FTP | other *** search
/ PC World Komputer 2010 April / PCWorld0410.iso / pluginy Firefox / 1833 / 1833.xpi / chrome / yoono.jar / content / yoono / yoonoGlobMemo.js < prev    next >
Text File  |  2009-12-16  |  8KB  |  232 lines

  1. // 2007 Xavier Grosjean
  2. // Methods for Memo 
  3.  
  4. // These are markers used to delimit the selection during processing. They
  5. // are removed from the final rendering, but we pick space-like characters for
  6. // safety (and futhermore, these are known to be mapped to a 0-length string
  7. // in transliterate.properties). It is okay to set start=end, we use findNext()
  8. // U+200B ZERO WIDTH SPACE
  9. const MARK_SELECTION_START = '\u200B\u200B\u200B\u200B\u200B';
  10. const MARK_SELECTION_END = '\u200B\u200B\u200B\u200B\u200B';
  11.  
  12. yoonoGlob.previousSelectedText = '';
  13.  
  14. // Wrapper method called when a create memo button is clicked
  15. // checks if user is not anonymous
  16. yoonoGlob.createMemo = function(parentId) {
  17.   var folderMsg = '';
  18.   if(parentId) folderMsg = ' in folder ' + parentId;
  19.   YOONO_LOG.debug('Creating new Memo' + folderMsg);
  20.   try {
  21.     var userId = YNPREFBRANCH.getCharPref("userid");
  22.     if(!userId.match(':')) {
  23.       alert("Anonymous users can't create Memos");
  24.       return;
  25.     }
  26.     alert("TODO : yoonoGlob.createMemo");
  27.   } catch(e) {
  28.     YOONO_LOG.exception(e);
  29.   }
  30. }
  31.  
  32. // Wrapper method called when a create memo folder button is clicked
  33. // checks if user is not anonymous
  34. yoonoGlob.createFolder = function(parentId) {
  35.   var folderMsg = '';
  36.   if(parentId) folderMsg = ' in folder ' + parentId;
  37.   YOONO_LOG.debug('Creating new Folder' + folderMsg);
  38.   try {
  39.     var userId = YNPREFBRANCH.getCharPref("userid");
  40.     if(!userId.match(':')) {
  41.       alert("Anonymous users can't create Memos");
  42.       return;
  43.     }
  44.     alert("TODO : yoonoGlob.createFolder");
  45.   } catch(e) {
  46.     YOONO_LOG.exception(e);
  47.   }
  48. }
  49.  
  50. // Fills the document context menu and auto menu submenu with all available memos
  51. yoonoGlob.showMemoContextMenu = function(evt, popup) {
  52.   // this proc gets called for each submenu showing...
  53.   if('mainPopup' != evt.target.getAttribute('name')) {
  54.     return;
  55.   }
  56.   
  57.   YOONO_LOG.debug('MENU');
  58.   // Empty menu first
  59.   while(popup.firstChild) {
  60.     popup.removeChild(popup.firstChild);
  61.   }
  62.   var title = '';
  63.   var memo = null;
  64.   var menuitem = null;
  65.  
  66.   // Fill the popup
  67.   createRecursiveContextMemoMenu(popup, 0);
  68.  
  69.   function createRecursiveContextMemoMenu(popup, memoParentId) {
  70.     var submenu = null;
  71.     var menuitem = null;
  72.     var memo = null;
  73.     var id = null;
  74.     var title = '';
  75.     for(var i=0 ; i<yoonoGlob.MemoMgr._memoList.length; i++) {
  76.       memo = yoonoGlob.MemoMgr._memoList[i];
  77.       if(memo.parentId != memoParentId) continue;
  78.       if('share' == memo.shortcutType) continue;
  79.       title = memo.title;
  80.       switch(memo.type) {
  81.         case 'MEMO':
  82.           menuitem = document.createElement('menuitem');
  83.           menuitem.setAttribute('label', title);
  84.           menuitem.setAttribute('oncommand', 'YOONO_CMPT.addStat(["buzz", "context-menu"]);yoonoGlob.addSelectionToMemo("' + memo.id + '")');
  85.           popup.appendChild(menuitem);
  86.         break;
  87.         case 'FOLDER':
  88.           submenu = document.createElement('menu');
  89.           submenu.setAttribute('label', title);
  90.           //id = memo.buttonIdFromFeedId();
  91.           submenu.setAttribute('id', memo.id);
  92.           submenu.setAttribute('class', 'menu-iconic contextmemofoldermenu');
  93.           var subpopup = document.createElement('menupopup');
  94.           submenu.appendChild(subpopup);
  95.           // insert on top of menu
  96.           if(!popup.firstChild) {
  97.             popup.appendChild(submenu);
  98.           } else {
  99.             popup.insertBefore(submenu, popup.firstChild);
  100.           }
  101.           createRecursiveContextMemoMenu(subpopup, memo.id);
  102.           // insert a 'create memo' menuitem on top of this submenu
  103.           // addCreateMemoMenuItem(subpopup, memo.id);
  104.         break;
  105.       }
  106.     }
  107.   }
  108.  
  109.   function addCreateMemoMenuItem(popup, memoId) {
  110.     var menuItem = document.createElement('menuitem');
  111.     var label = yoonoGlob.gStrbundle.getString('memo.create.infolder');
  112.     if(popup.getAttribute('name') == 'mainPopup') 
  113.       label = yoonoGlob.gStrbundle.getString('memo.create');
  114.  
  115.     menuItem.setAttribute('label', label);
  116.     menuItem.setAttribute('oncommand', 'yoonoGlob.createMemo(' + memoId + ')');
  117.     var sep = document.createElement('menuseparator');
  118.     // if popup is empty, append
  119.     if(!popup.firstChild)
  120.       popup.appendChild(sep);
  121.     else
  122.       popup.insertBefore(sep, popup.firstChild);
  123.  
  124.     popup.insertBefore(menuItem, popup.firstChild);
  125.   }
  126. }
  127.  
  128. yoonoGlob.addSelectionToMemo = function(idMemo) {
  129.   YOONO_LOG.debug('yoonoGlob.addSelectionToMemo : ' + idMemo);
  130.   var text = yoonoGlob.getSelectedText();
  131.   if(yoonoGlob.sidebar.visible) {
  132.     var result = yoonoGlob.sidebar.sidebarMethods.methods.addToMemo(idMemo, text);
  133.   } else {
  134.     yoonoGlob.toggleSb();
  135.     // HAHA just for fun. Make it better asap
  136.     setTimeout(function() {
  137.                  yoonoGlob.sidebar.sidebarMethods.methods.addToMemo(idMemo, text);
  138.                }, 1000);
  139.   }
  140. }
  141.  
  142. yoonoGlob.hideMemoContextMenu = function(popup) {
  143. }
  144.  
  145. yoonoGlob.getSelectedText = function() {
  146.   var morceau = '';
  147.   try {
  148.     if(gContextMenu && !gContextMenu.isTextSelected) {
  149.       if(gContextMenu.imageURL) {
  150.         var b = getBrowser();
  151.         var urlPage = b.contentDocument.URL;
  152.         morceau = '<img src="' + gContextMenu.imageURL + '" ' 
  153.                             + 'class="yoono-image" onclick="window.open(\''
  154.                             + urlPage + '\', \'\')" link="true">';
  155.         return(morceau);
  156.       }
  157.       if(gContextMenu.link) {
  158.         morceau = '<a href="' + gContextMenu.link + '" ' 
  159.                             + 'target="_blank">' + gContextMenu.link + '</a>';
  160.         return(morceau);
  161.       }
  162.     }
  163.  
  164.     var fwsel = yoonoGlob.getSelection();
  165.     if(!fwsel) {
  166.       return '';
  167.     }
  168.     var sel= fwsel[1];
  169.     if(sel && sel.isCollapsed) return '';
  170.     var fw = fwsel[0];
  171.  
  172.     var doc = fw.document;
  173.     // D├⌐ relativiser les images
  174.     var img = null;
  175.     for(var i=0 ; i < doc.images.length; i++) {
  176.       img = doc.images[i];
  177.       img.setAttribute('src', img.src);
  178.     }
  179.     // d├⌐ relativiser les links
  180.     var link = null;
  181.     for(var i=0 ; i < doc.links.length; i++) {
  182.       link = doc.links[i];
  183.       link.setAttribute('href', link.href);
  184.     }
  185.     // texte sans html : sel.toString();
  186.     var content = YOONO_SIDEBAR.getContainerForSelection(sel);
  187.     var xhtml = YOONO_SIDEBAR.serializer.serializeToString(content);
  188.     morceau = xhtml.slice(xhtml.indexOf(MARK_SELECTION_START) + MARK_SELECTION_START.length, xhtml.lastIndexOf(MARK_SELECTION_END));
  189.     var cleanDiv = doc.createElement('div');
  190.     // We need to remove all 'on...' attributes that could be used to execute malicious code...
  191.     // and remove the scripts too
  192.     cleanDiv.innerHTML = morceau;
  193.     var tags = cleanDiv.getElementsByTagName('*');
  194.     var elt = null;
  195.     var attr = null;
  196.     var nbAttr = 0;
  197.     for(var i=0 ; i < tags.length; i++) {
  198.       var elt = tags[i];
  199.       if('SCRIPT' == elt.nodeName) {
  200.         elt.innerHTML = '';
  201.       }
  202.       if(('attributes' in elt) && elt.attributes.length) {
  203.         nbAttr = elt.attributes.length;
  204.         for(var j=nbAttr - 1 ; j >= 0; j--) {
  205.           attr = elt.attributes[j];
  206.           if('on' == attr.name.substr(0,2)) {
  207.             elt.removeAttribute(attr.name);
  208.           }
  209.         }
  210.       }
  211.     }
  212.     morceau = cleanDiv.innerHTML;
  213.  
  214.  
  215.   } catch(e) {
  216.     YOONO_LOG.exception(e);
  217.   }
  218.   return(morceau);
  219. }
  220.  
  221. yoonoGlob.getSelection = function() {
  222.   var focusedWindow = yoonoGlob.focusedWindow;
  223.   if (!focusedWindow || !focusedWindow.document)
  224.     return null;
  225.   var selection = focusedWindow.getSelection();
  226.   return([focusedWindow, selection]);
  227. }
  228.  
  229.  
  230.  
  231.  
  232.